package com.cxx.framework.app.security;

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.io.Reader;
import java.io.StringWriter;
import java.io.Writer;

import javax.servlet.http.Cookie;
import javax.servlet.http.HttpServletRequest;

import org.apache.log4j.Logger;
import org.springframework.security.web.authentication.preauth.AbstractPreAuthenticatedProcessingFilter;

/**
 * 
 */
public class PreAuthFilter extends AbstractPreAuthenticatedProcessingFilter
{
    private static final Logger logger = Logger.getLogger (PreAuthFilter.class);

    @Override
    protected Object getPreAuthenticatedCredentials (HttpServletRequest request)
    {
        return "DUMMY_NOT_NULL_VALUE";
    }

    @Override
    protected Object getPreAuthenticatedPrincipal (HttpServletRequest request)
    {
        String userId = null;
        try
        {

            if (request.getUserPrincipal () != null)
            {
                logger.info ("preauth tried for session:" + request.getSession ().getId ());
                return null;

            }

            Cookie[] cookies = request.getCookies ();
            // String userEndpoint = null;

            if (cookies != null)
            {
                for (int c = 0; c < cookies.length; c++)
                {
                    String cookieName = cookies[c].getName ();
                    logger.info ("cookieName: " + cookieName);

                }
            }

        }
        catch (Exception e)
        {
            logger.warn ("Error connecting to user enpdoint", e);
        }

        if (userId == null)
        {
            logger.debug ("No user id in session.");
        }

        logger.debug ("Returning no user");
        return null;
    }

    public static String convertStreamToString (InputStream is) throws IOException
    {
        /*
         * To convert the InputStream to String we use the Reader.read(char[]
         * buffer) method. We iterate until the Reader return -1 which means
         * there's no more data to read. We use the StringWriter class to
         * produce the string.
         */
        if (is != null)
        {
            Writer writer = new StringWriter ();

            char[] buffer = new char[1024];
            try
            {
                Reader reader = new BufferedReader (new InputStreamReader (is, "UTF-8"));
                int n;
                while ((n = reader.read (buffer)) != -1)
                {
                    writer.write (buffer, 0, n);
                }
            }
            finally
            {
                is.close ();
            }
            return writer.toString ();
        }
        else
        {
            return "";
        }
    }

}
